// File: jmcomic-core/src/main/java/dev/jukomu/common/util/args/ArgsUtils.java
package dev.jukomu.common.util.args;

import java.util.AbstractMap.SimpleEntry;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ArgsUtils {

    /**
     * 将单个对象处理为参数数组和关键字参数Map。
     * 对应Python的 process_single_arg_to_args_and_kwargs。
     *
     * @param obj 输入对象，可以是列表、Map或单个值
     * @return 包含参数数组和关键字参数Map的Pair
     */
    public static Map.Entry<Object[], Map<String, Object>> processSingleArgToArgsAndKwargs(Object obj) {
        if (obj instanceof List) {
            return processArgsKwargs((List<?>) obj, null);
        }
        if (obj instanceof Map) {
            // 确保Map的键是String类型
            Map<String, Object> kwargs = new HashMap<>();
            ((Map<?, ?>) obj).forEach((k, v) -> kwargs.put(String.valueOf(k), v));
            return new SimpleEntry<>(new Object[0], kwargs);
        }
        return new SimpleEntry<>(argToTuple(obj), new HashMap<>());
    }

    /**
     * 将参数列表和关键字参数Map进行处理。
     * 对应Python的 process_args_kwargs。
     *
     * @param args   参数列表（可以是单个值、List或null）
     * @param kwargs 关键字参数Map（可以是null）
     * @return 包含参数数组和关键字参数Map的Pair
     */
    public static Map.Entry<Object[], Map<String, Object>> processArgsKwargs(Object args, Map<String, Object> kwargs) {
        Object[] argsArray = argToTuple(args);
        Map<String, Object> processedKwargs = kwargs != null ? new HashMap<>(kwargs) : new HashMap<>();
        return new SimpleEntry<>(argsArray, processedKwargs);
    }

    /**
     * 将参数转换为Object数组。
     * 对应Python的 arg_to_tuple。
     *
     * @param args 输入参数，可以是单个值、List或null
     * @return Object数组
     */
    public static Object[] argToTuple(Object args) {
        if (args == null) {
            return new Object[0];
        }
        if (args instanceof Object[]) {
            return (Object[]) args;
        }
        if (args instanceof List) {
            return ((List<?>) args).toArray();
        }
        // 如果是其他单一类型，包装成单元素数组
        return new Object[]{args};
    }
}